package async_task

import (
	"fmt"
	"go_async_task/utils"
)

type TaskStruct struct {
	Name string `json:"name"`
}

var TaskChan = make(chan TaskStruct, 1) // 缓冲区设为1

// 项目启动时调用，监听并获取channel中的数据发送HTTP请求
func AsyncHandleHttpTask() {
	// recover error
	defer func() {
		if errRecover := recover(); errRecover != nil {
			// TODO 记录日志等等，这里就省略了
			fmt.Println("errRecover: ", errRecover)
		}
	}()

	// 轮询、监听 channel中的数据，如果收到了数据就构建请求
	// 方法一
	for taskData := range TaskChan {
		fmt.Println("从Channel中轮询接收数据并发送请求")
		currName := taskData.Name
		// 发送请求, TODO 忽略错误，实际项目中应该记录错误
		_ = utils.HandleRequestIndex(currName)
	}

	// 方法二
	//for {
	//	select {
	//	case currTask := <- TaskChan:
	//		fmt.Println("从Channel中轮询接收数据并发送请求")
	//		currName := currTask.Name
	//		_ = utils.HandleRequestIndex(currName)
	//	}
	//}

}

// 异步往channel中发送数据
func ReportDataToTaskChannel(task TaskStruct) {
	// recover
	defer func() {
		if errRecover := recover(); errRecover != nil {
			// TODO 记录日志等等，这里就省略了
			fmt.Println("errRecover: ", errRecover)
		}
	}()

	select {
	// 只往channel中发送数据
	case TaskChan <- task:
	// 缓冲区满了记录一下
	default:
		fmt.Println("缓冲区满了....")
		// TODO 记录log等
	}

}
